BiasAdd ================= 将偏置向量 input_bias 沿通道维广播,加到输入张量 input_x 上。 .. math:: \mathrm{output} = \mathrm{input\_x} + \mathrm{input\_bias} - NCHW::math:`\mathrm{output}(n,c,h,w) = \mathrm{input\_x}(n,c,h,w) + \mathrm{input\_bias}(c)` - NHWC::math:`\mathrm{output}(n,h,w,c) = \mathrm{input\_x}(n,h,w,c) + \mathrm{input\_bias}(c)` 输入: - **input_x** - 输入张量地址 - **input_bias** - 偏置地址,长度等于通道数 C;c64 时为交错复数,长度 2C 个 float - **dims** - 维度数组;NCHW 为 [N, C, H, W],NHWC 为 [N, H, W, C] - **shape_size** - 维数(测试常用 4) - **data_format** - 布局:0 为 NCHW,1 为 NHWC(整型,不是字符串) - **length** - input_x 元素个数(复数时为复数个数) - **core_mask** - 核掩码(仅共享存储版本) 输出: - **output** - 输出地址,形状与 input_x 相同 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持 int8、int16、int32、fp32、fp64、cplx64、cplx128 - MT7004 支持 int16、int32、fp16、fp32、cplx64 - data_format 为 int:0 = NCHW,非 0(测试用 1)= NHWC **共享存储版本:** .. c:function:: void i8_bias_add_s(int8_t *input_x, int8_t *input_bias, int8_t *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void i16_bias_add_s(int16_t *input_x, int16_t *input_bias, int16_t *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void i32_bias_add_s(int32_t *input_x, int32_t *input_bias, int32_t *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void hp_bias_add_s(float16 *input_x, float16 *input_bias, float16 *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void fp_bias_add_s(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void dp_bias_add_s(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void c64_bias_add_s(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length, int core_mask) .. c:function:: void c128_bias_add_s(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 14 // MT7004 示例(共享存储多核,DDR 地址,NHWC) void TestBiasAddSMCFp32(int core_mask) { int core_id = get_core_id(); int logic_core_id = GetLogicCoreId(core_mask, core_id); int core_num = GetCoreNum(core_mask); float *input_x = (float *)0x81000000; float *input_bias = (float *)0x82000000; float *output = (float *)0x83000000; int *dims = (int *)0x85000000; if (logic_core_id == 0) { dims[0] = 1; dims[1] = 4; dims[2] = 4; dims[3] = 16; /* N,H,W,C */ } sys_bar(0, core_num); fp_bias_add_s(input_x, input_bias, output, dims, 4, 1 /* NHWC */, 256, core_mask); } void main() { int core_mask = 0b1111; TestBiasAddSMCFp32(core_mask); } **私有存储版本:** .. c:function:: void i8_bias_add_p(int8_t *input_x, int8_t *input_bias, int8_t *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void i16_bias_add_p(int16_t *input_x, int16_t *input_bias, int16_t *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void i32_bias_add_p(int32_t *input_x, int32_t *input_bias, int32_t *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void hp_bias_add_p(float16 *input_x, float16 *input_bias, float16 *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void fp_bias_add_p(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void dp_bias_add_p(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void c64_bias_add_p(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length) .. c:function:: void c128_bias_add_p(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 8 // MT7004 示例(私有存储单核,AM 地址,NHWC) void TestBiasAddAMFp32(void) { float *input_x = (float *)0x10010000; float *input_bias = (float *)0x10020000; float *output = (float *)0x10030000; int *dims = (int *)0x10050000; dims[0] = 1; dims[1] = 4; dims[2] = 4; dims[3] = 16; /* N,H,W,C */ fp_bias_add_p(input_x, input_bias, output, dims, 4, 1 /* NHWC */, 256); } void main() { TestBiasAddAMFp32(); }